home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / modula2 / module / bliste.mod < prev    next >
Encoding:
Modula Implementation  |  1995-11-25  |  5.4 KB  |  237 lines

  1. IMPLEMENTATION MODULE  BListe;
  2.  
  3. FROM SYSTEM IMPORT TSIZE;
  4. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  5.  
  6. TYPE List               = POINTER TO ListHeader;
  7.      ListElementPointer = POINTER TO ListElement;
  8.      ListHeader         = RECORD
  9.                              current,
  10.                              first,last : ListElementPointer;
  11.                           END ;
  12.      ListElement        = RECORD
  13.                              next,prev     : ListElementPointer;
  14.                              value         : Kunde
  15.                           END(*RECORD*);
  16.  
  17.  
  18. PROCEDURE MakeList(VAR L:List);
  19. BEGIN
  20.    ALLOCATE(L,TSIZE(ListHeader));
  21.    L^.first:=NIL;
  22.    L^.last:=NIL;
  23.    L^.current:=NIL;
  24. END MakeList;
  25.  
  26. PROCEDURE KillList(VAR L:List);
  27. VAR p,q:ListElementPointer;
  28. BEGIN
  29.     p:=L^.first;
  30.     WHILE (p#NIL) DO
  31.       q:=p;
  32.       p:=p^.next;
  33.       DEALLOCATE(q);
  34.     END(*WHILE*);
  35.     DEALLOCATE(L);
  36.     L:=NIL
  37. END KillList;
  38.  
  39. PROCEDURE First(VAR L:List);
  40. BEGIN
  41.     L^.current:=L^.first;
  42. END First;
  43.  
  44. PROCEDURE Last(VAR L:List);
  45. BEGIN
  46.     L^.current:=L^.last;
  47. END Last;
  48.  
  49. PROCEDURE Next(VAR L:List);
  50. BEGIN
  51.    IF (~Empty(L) AND (L^.current^.next # NIL))THEN
  52.       L^.current:=L^.current^.next;
  53.    END(*IF*);
  54. END Next;
  55.  
  56. PROCEDURE Prev(VAR L:List);
  57. BEGIN
  58.    IF (~Empty(L) AND (L^.current^.prev # NIL))THEN
  59.       L^.current:=L^.current^.prev;
  60.    END(*IF*);
  61. END Prev;
  62.  
  63. PROCEDURE Empty(VAR L:List):BOOLEAN;
  64. BEGIN
  65.    RETURN L^.first=NIL
  66. END Empty;
  67.  
  68. PROCEDURE AtFirst(VAR L:List):BOOLEAN;
  69. BEGIN
  70.    RETURN L^.current=L^.first
  71. END AtFirst;
  72.  
  73. PROCEDURE AtLast(VAR L:List):BOOLEAN;
  74. BEGIN
  75.    RETURN L^.current=L^.last
  76. END AtLast;
  77.  
  78. PROCEDURE Find(VAR L:List;VAR Value:Kunde; VAR Finde:VglProc; Key:Kunde ):BOOLEAN;
  79. VAR OK :BOOLEAN;
  80. BEGIN
  81.     IF ~Empty(L) THEN
  82.        LOOP
  83.           OK:=GetValue(L,Value);
  84.           IF Finde(Value,Key) THEN
  85.              RETURN TRUE
  86.           ELSE
  87.               IF AtLast(L) THEN
  88.                     RETURN FALSE
  89.               END(*IF*);
  90.               Next(L);
  91.           END(*IF*);
  92.        END(*LOOP*);
  93.     ELSE
  94.        RETURN FALSE
  95.     END(*IF*);
  96. END Find;
  97.  
  98. PROCEDURE FindFirst(VAR L:List;VAR Value:Kunde; VAR Finde:VglProc; Key:Kunde):BOOLEAN;
  99. BEGIN
  100.    IF ~Empty(L) THEN
  101.       First(L);
  102.       RETURN Find(L,Value,Finde,Key);
  103.    ELSE
  104.       RETURN FALSE
  105.    END(*IF*);
  106. END FindFirst;
  107.  
  108. PROCEDURE FindNext(VAR L:List;VAR Value:Kunde; VAR Finde:VglProc;Key:Kunde):BOOLEAN;
  109. BEGIN
  110.    IF ~Empty(L) THEN
  111.       Next(L);
  112.       RETURN Find(L,Value,Finde,Key);
  113.    ELSE
  114.       RETURN FALSE
  115.    END(*IF*);
  116. END FindNext;
  117.  
  118. PROCEDURE BubbleSort(VAR L:List;VAR Vgl:VglProc);
  119. (* Vgl Proc liefert TRUE für Value1>Value2 *)
  120. VAR Value1,Value2 : Kunde;
  121.          OK, flag : BOOLEAN;
  122. BEGIN
  123.   IF ~Empty(L) THEN
  124.       flag:= FALSE;
  125.       WHILE ~flag DO
  126.              Last(L);
  127.              flag:= TRUE;
  128.              WHILE ~AtFirst(L) DO
  129.                OK:=GetValue(L,Value1);
  130.                Prev(L);
  131.                OK:=GetValue(L,Value2);
  132.                IF Vgl(Value1,Value2) THEN
  133.                   flag:=FALSE;
  134.                   SetValue(L,Value1);
  135.                   Next(L);
  136.                   SetValue(L,Value2);
  137.                   Prev(L);
  138.                END(*IF*);
  139.              END(*WHILE*);
  140.       END(*WHILE*);
  141.   END(*IF*);
  142. END  BubbleSort;
  143.  
  144. PROCEDURE GetValue(VAR L:List;VAR Value :Kunde):BOOLEAN;
  145. VAR i:INTEGER;
  146. BEGIN
  147.    IF ~Empty(L) THEN
  148.          Value:=L^.current^.value;
  149.      RETURN TRUE
  150.    ELSE
  151.      RETURN FALSE
  152.    END(*IF*);
  153. END GetValue;
  154.  
  155. PROCEDURE SetValue(VAR L:List;Value :Kunde);
  156. VAR  i:INTEGER;
  157. BEGIN
  158.    IF ~Empty(L) THEN
  159.          L^.current^.value:=Value;
  160.    END(*IF*);
  161. END SetValue;
  162.  
  163. PROCEDURE EnterElement(VAR L:List);
  164. VAR p,q :ListElementPointer;
  165. BEGIN
  166.    ALLOCATE(p,TSIZE(ListElement));
  167.    IF Empty(L) THEN
  168.          L^.first:=p;
  169.          L^.last:=p;
  170.          p^.next:=NIL;
  171.          p^.prev:=NIL;
  172.    ELSIF AtFirst(L) THEN
  173.          p^.next:=L^.first;
  174.          L^.first:=p;
  175.          p^.prev:=NIL;
  176.          L^.current^.prev:=p;
  177.    ELSE
  178.          p^.next:=L^.current;
  179.          p^.prev:=L^.current^.prev;
  180.          q:=L^.current^.prev;
  181.          q^.next:=p;
  182.          L^.current^.prev:=p;
  183.   END(*IF*);
  184.   L^.current:=p;
  185. END EnterElement;
  186.  
  187. PROCEDURE AppendElement(VAR L:List);
  188. VAR p,q :ListElementPointer;
  189. BEGIN
  190.    ALLOCATE(p,TSIZE(ListElement));
  191.    IF Empty(L) THEN
  192.          L^.first:=p;
  193.          L^.last:=p;
  194.          p^.next:=NIL;
  195.          p^.prev:=NIL;
  196.    ELSIF AtLast(L) THEN
  197.          p^.prev:=L^.last;
  198.          L^.last:=p;
  199.          p^.next:=NIL;
  200.          L^.current^.next:=p;
  201.    ELSE
  202.          p^.next:=L^.current^.next;
  203.          p^.prev:=L^.current;
  204.          q:=L^.current^.next;
  205.          q^.prev:=p;
  206.          L^.current^.next:=p;
  207.   END(*IF*);
  208.   L^.current:=p;
  209. END AppendElement;
  210.  
  211. PROCEDURE RemoveElement(VAR L:List);
  212. VAR p,q :ListElementPointer;
  213. BEGIN
  214.    IF ~Empty(L) THEN
  215.    p:=L^.current;
  216.    IF (AtFirst(L) AND AtLast(L)) THEN
  217.        L^.first:=NIL;
  218.        L^.last:=NIL;
  219.        L^.current:=NIL;
  220.    ELSIF AtFirst(L) THEN
  221.        L^.first:=L^.current^.next;
  222.        L^.first^.prev:=NIL;
  223.        L^.current:=L^.current^.next;
  224.    ELSIF AtLast(L) THEN
  225.        L^.last:=L^.current^.prev;
  226.        L^.last^.next:=NIL;
  227.        L^.current:=L^.current^.prev;
  228.    ELSE
  229.        p^.prev^.next:=p^.next;
  230.        p^.next^.prev:=p^.prev;
  231.        L^.current:=L^.current^.next;
  232.    END(*IF*);
  233.    DEALLOCATE(p);
  234.    END(*IF*);
  235. END RemoveElement;
  236. END BListe.
  237.